// 文件名：basic_string_sql_builder.cpp
// 目的：构建带参数占位符（prepared statement）的 INSERT 语句骨架，避免直接拼接值导致注入。
// 接口：buildInsert(table, columns, valueCount)
//   - table：表名（string_view 直接 append，无拷贝）；
//   - columns：列名数组；valueCount：占位符数量，应与列数一致；
// 实现：
//   - INSERT INTO <table> (<col1>, <col2>, ...) VALUES (?, ?, ...);
//   - 仅构造 SQL 模板，不包含具体参数值，由数据库驱动后续绑定；
//   - 对 columns.empty 或尺寸不匹配抛出异常。
// 复杂度：O(C)，C 为列名总长度（append 与拼接为线性）。
// 注意事项：
//   - 列名/表名若来源不可信，仍需对标识符做白名单或引用（例如使用引号/反引号），以避免关键字/注入；
//   - 实际绑定参数时由数据库驱动进行转义与类型安全（? 占位符）；
//   - 可根据目标数据库替换占位符风格（如 $1, $2 或 :name）。

#include <iostream>
#include <stdexcept>
#include <string>
#include <string_view>
#include <vector>

std::string buildInsert(std::string_view table,
                        const std::vector<std::string>& columns,
                        std::size_t valueCount) {
    if (columns.empty() || valueCount != columns.size()) {
        throw std::runtime_error("columns and values size mismatch");
    }

    std::string sql;
    sql.reserve(64 + columns.size() * 16);

    sql.append("INSERT INTO ");
    sql.append(table);
    sql.append(" (");

    for (std::size_t i = 0; i < columns.size(); ++i) {
        if (i > 0) sql.append(", ");
        sql.append(columns[i]);
    }

    sql.append(") VALUES (");
    for (std::size_t i = 0; i < valueCount; ++i) {
        if (i > 0) sql.append(", ");
        sql.push_back('?'); // parameter placeholder for prepared statement
    }
    sql.append(");");
    return sql;
}

int main() {
    std::vector<std::string> columns = {"name", "email", "created_at"};
    std::string sql = buildInsert("users", columns, columns.size());
    std::cout << sql << '\n';
    return 0;
}